package com.todo.controller;


import com.todo.dto.LoginFormDTO;
import com.todo.dto.Result;
import com.todo.dto.UpdatePasswordDTO;
import com.todo.entity.UserInfo;
import com.todo.service.IUserInfoService;
import com.todo.service.IUserService;
import com.todo.utils.UIDUtil;
import com.todo.utils.UserHolder;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author carol
 * @since 2023-9-6
 */
@Slf4j
@RestController
@Api(tags = "用户功能接口")
@RequestMapping("/user")
public class UserController {

    @Resource
    private UIDUtil uidUtil;

    @Resource
    private IUserService userService;

    @Resource
    private IUserInfoService userInfoService;

    /**
     * 发送手机验证码
     */
    @ApiOperation("用户-发送手机验证码")
    @PostMapping("code")
    public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
        return userService.sendCode(phone,session);
    }

    /**
     * 登录功能
     * @param loginForm 登录参数，包含手机号、验证码；或者手机号、密码
     */
    @ApiOperation("用户-登录接口")
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm){
        return userService.login(loginForm);
    }

    /**
     * 登出功能
     * @return 无
     */
    @ApiOperation("用户-退出登录接口")
    @PostMapping("/logout")
    public Result logout(){
        // TODO 实现登出功能
        UserHolder.removeUser();
        return Result.fail("功能未完成");
    }

    @GetMapping("/me")
    @ApiOperation("用户-我的信息接口")
    public Result me(){
        String uid = UserHolder.getUser().getUid();
        return Result.ok(userService.getMyInfo(uid));
    }

    /**
     * 根据用户uid查询用户详细信息
     * @param uid
     * @return
     */
    @GetMapping("/info/{uid}")
    @ApiOperation("用户详情信息接口")
    public Result info(@PathVariable("uid") String uid){
        // 查询详情
        UserInfo info = userInfoService.getById(uid);
        if (info == null) {
            // 没有详情，应该是第一次查看详情
            return Result.ok();
        }
        info.setCreateTime(null);
        info.setUpdateTime(null);
        // 返回
        return Result.ok(info);
    }

    /**
     * 传入旧密码+新密码或传入旧密码+验证码修改密码
     * @param updatePasswordDTO
     * @return
     */
    @PostMapping("/updatePassword")
    @ApiOperation("手机短信验证修改当前用户密码")
    public Result updatePasswordByCode(@RequestBody UpdatePasswordDTO updatePasswordDTO){
        return userService.updatePassword(updatePasswordDTO);
    }


}
